//package com.sskj.ffmpeg;
//
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.io.FileUtils;
//import org.springframework.beans.factory.InitializingBean;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.scheduling.annotation.EnableScheduling;
//import org.springframework.scheduling.annotation.Scheduled;
//import org.springframework.stereotype.Service;
//
//import java.io.File;
//import java.util.concurrent.ConcurrentHashMap;
//
///**
// * rtsp 转 hlv协议
// * @author Admin
// */
//@Service
//@Slf4j
//@EnableScheduling
//public class RtspConvert  implements InitializingBean {
//    //转换map
//    private static ConcurrentHashMap<String, CoverThread> coverMap = new ConcurrentHashMap<>();
//
//    @Value("${ffmpeg.command}")
//    private String ffmpegPath;
//
//    @Value("${ffmpeg.outputPath}" )
//    private String outputPath;
//
//    @Value("${ffmpeg.outputPath}")
//    private String rtspUrl;
//
//    @Override
//    public void afterPropertiesSet() throws Exception {
//
//    }
//
//    /**
//     * 转换rtsp并获取hls文件路径
//     */
//    public String rtsp2Hls(String code, String rtspUrl) {
//        // 需要从新地址重新开始拉流，故注释掉
//        /*if (coverMap.containsKey(code)) {
//            CoverThread thread = coverMap.get(code);
//            if (thread == null || thread.getTaskState() != CoverThread.running) {
//            } else {
//                return thread.getM3U8File();
//            }
//        }*/
//        String m3u8File =String.format(m3u8Path, code);
//        startTransform(code, rtspUrl, m3u8File);
//        CoverThread thread = coverMap.get(code);
//        if (thread != null) {
//            return thread.getM3U8File();
//        }
//        return null;
//    }
//    /**
//     * 开启转换
//     */
//    private void startTransform(String code, String rtspUrl, String m3u8Path) {
//        log.info("转换rtsp, {},{},{}", code, rtspUrl, m3u8Path);
//        String memKey = "startLive" + code;
//        synchronized (memKey.intern()) {
//            if (coverMap.containsKey(code)) {
//                stopTransform(code);
//            }
//            CoverThread thread = new CoverThread(code, rtspUrl, m3u8Path);
//            coverMap.put(code, thread);
//            thread.start();
//        }
//    }
//
//    /**
//     * 停止转换
//     */
//    public void stopTransform(String code) {
//        String memKey = "startLive" + code;
//        synchronized (memKey.intern()) {
//            if (coverMap.containsKey(code)) {
//                CoverThread thread = coverMap.get(code);
//                if (thread != null && thread.getTaskState() != CoverThread.fail) {
//                    thread.stopTask();
//                    log.info("结束{}转换线程", code);
//                }
//            }
//        }
//    }
//
//    /**
//     * 监控所有的转换线程
//     */
//    @Scheduled(cron = "0 0/10 * * * ?")
//    public synchronized void monitorThreads() {
//        for (String code : coverMap.keySet()) {
//            CoverThread thread = coverMap.get(code);
//            // 晚上8点后停止拉流
////            LocalDateTime now = LocalDateTime.now();
////            LocalTime twentyOclock = LocalTime.of(stopCoverHour
////, 0);
////            if (now.toLocalTime().isAfter(twentyOclock)) {
////                stopTransform(code);
////                continue;
////            }
//            if (thread != null && thread.getTaskState() != CoverThread.running) {
//                //线程出现异常，重新获取视频流地址
////                String response = FdcjspService.getCamerasUrlByCode(code);
////                JSONObject jsonObject = JSON.parseObject(response);
////                if ("0".equals(jsonObject.get("code"))) {
////                    JSONObject parse = (JSONObject) jsonObject.get("data");
////                    String rtspUrl = (String) parse.get("url");
////                    rtsp2Hls(code, rtspUrl);
////                }
//                stopTransform(code);
//            }
//        }
//    }
//
//    /**
//     * 执行命令线程
//     */
//    private class CoverThread extends Thread {
//        private String code;
//        private String rtspUrl;
//        private String m3u8File;
//        private int taskState = 0; //运行状态 0未开始 1进行中 -1失败
//        private static final int notStart = 0;
//        private static final int running = 1;
//        private static final int fail = -1;
//        private Process process = null;
//
//        CoverThread(String code, String rtspUrl, String m3u8File) {
//            this.code = code;
//            this.rtspUrl = rtspUrl;
//            this.m3u8File = m3u8File;
//            setName("m3u8-" + code);
//            this.taskState = notStart;
//        }
//
//        @Override
//        public void run() {
//            try {
//                FileUtils.forceMkdir(new File(m3u8File).getParentFile());
//
//                String[] command = {
//                        ffmpegPath,
//                        "-i", rtspUrl,
//                        "-c:v", "libx264",
//                        "-preset", "fast",
//                        "-crf", "20",
//                        "-c:a", "aac",
//                        "-b:a", "128k",
//                        "-f", "hls",
//                        "-hls_time", "10",
//                        "-hls_list_size", "10",
//                        "-hls_flags", "delete_segments",
//                        outputPath
//                };
//
//                //状态设置为运行中
//                this.taskState = running;
//
//                ProcessBuilder builder = new ProcessBuilder(command);
//
//                // 开始执行命令
//                log.info("执行命令：" + command);
//                process = builder.start();
//                // 启动线程读取输出流
//                /*BufferedReader inputStreamReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
//                inputStreamReader.lines().forEach(System.out::println);
//
//                BufferedReader errorStreamReader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
//                errorStreamReader.lines().forEach(System.err::println);*/
//                // 命令中加入 2>/data/null 不输出日志，故不用读取日志
//                int flag = process.waitFor();
//                log.info("结束{}", code);
//            } catch (Exception e) {
//                log.error("出现异常" + e.getMessage(), e);
//                this.taskState = fail;
//            } finally {
//                if (process != null) {
//                    try {
//                        process.exitValue();
//                    } catch (Exception e) {
//                    }
//                    try {
//                        process.destroyForcibly();
//                    } catch (Exception e) {
//                    }
//                }
//            }
//        }
//
//        /**
//         * 获取任务执行状态
//         */
//        public int getTaskState() {
//            return taskState;
//        }
//
//        public String getM3U8File() {
//            return this.m3u8File;
//        }
//
//        public String getRtspUrl() {
//            return this.rtspUrl;
//        }
//
//        /**
//         * 立即停止任务
//         */
//        public void stopTask() {
//            if (process != null) {
//                try {
//                    process.destroy();
//                } catch (Exception e) {
//                    e.printStackTrace();
//                }
//            }
//        }
//    }
//}
